<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <script>

        // 每一个函数都有一个属性叫做  prototype  


        // 每一个对象都有一个属性叫做  __proto__
        //     指向该构造函数的prototype



        // 原型链
        //    每一个对象都有一个属性  __proto__   指向这个构造函数的原型对象(prototype)   p.__proto__  === Person.prototype
        //    构造函数的原型对象的原型    指向对象的原型对象                             Person.prototype.__proto__ === Object.prototype
        //    对象的原型对象的原型        指向 null                                    Object.prototype.__proto__  === null


        //    自己的理解：为每一个对象在访问某个属性或者方法的时候，提供依据(上一层查找)
        //        访问一个对象的属性或者方法的时候，自己有就优先使用自己的
        //        自己没有，就去原型对象上找，如果找到就使用
        //        如果原型对象上也没有，就去对象的原型对象上找，如果找到就使用
        //         如果对象的原型对象上也没有  报错






        const arr = new Array(1, 2, 3);
        // arr 就是一个对象   Array是它的构造函数
        // arr有一个属性__proto__   指向Array的prototype






        function Person(name) {
            this.name = name;
            this.say = function () {
                console.log(222);
            }
        }

        Person.prototype.say = function () {
            console.log(111);
        }


        const p = new Person('cc');

        console.log(p);

        p.say();

        p.toString();

        console.log(p.constructor === Person);

        console.log(p.__proto__ === Person.prototype);


        // Person.prototype也是一个对象   也拥有  __proto__ 这个属性
        console.log(Person.prototype.__proto__ === Object.prototype);

        // 
        console.log(Object.prototype.__proto__ === null);   // null



        //    p 本身是由Person这个构造函数创建的   p能拥有这个构造函数的属性和方法

        //    p 的constructor 会指向构造函数
        //    p 的 __proto__  会指向 prototype





        // 

        const obj = {};

        console.log(obj.__proto__ === Object.prototype);
        console.log(Object.prototype.__proto__ === null);




    </script>

</body>

</html>